package edu.uoc.vmerinom.tfc.report;

import java.io.IOException;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import edu.uoc.vmerinom.tfc.domain.Asistente;
import edu.uoc.vmerinom.tfc.domain.Grupo;
import edu.uoc.vmerinom.tfc.domain.Reunion;
import edu.uoc.vmerinom.tfc.domain.Usuario;
import edu.uoc.vmerinom.tfc.service.ReunionesService;
import edu.uoc.vmerinom.tfc.support.Message;
import edu.uoc.vmerinom.tfc.support.Utils;

import net.sf.jooreports.templates.DocumentTemplateException;

/**
 * Clase que gestiona la generación de informes a través del servidor de
 * LibreOffice para el módulo de reuniones y actas.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("reunionesReport")
@Scope(ScopeType.CONVERSATION)
public class ReunionesReport extends Reports {

	/**
	 * Ruta y nombre de la plantilla.
	 */
	static final String RUTA_PLANTILLA_LISTADO = "/libreoffice/acta.odt";
	/**
	 * Campo texto reunión.
	 */
	static final String TEXTO_REUNION = "textoReunion";
	/**
	 * Campo título orden.
	 */
	static final String TITULO_ORDEN = "tituloOrden";
	/**
	 * Campo título asistentes.
	 */
	static final String TITULO_ASISTENTES = "tituloAsistentes";
	/**
	 * Campo título grupos.
	 */
	static final String TITULO_GRUPOS = "tituloGrupos";
	/**
	 * Campo título acuerdos.
	 */
	static final String TITULO_ACUERDOS = "tituloAcuerdos";
	/**
	 * Campo título observaciones.
	 */
	static final String TITULO_OBSERVACIONES = "tituloObservaciones";
	/**
	 * Campo orden.
	 */
	static final String CAMPO_ORDEN = "orden";
	/**
	 * Campo asistentes.
	 */
	static final String CAMPO_ASISTENTES = "asistentes";
	/**
	 * Campo grupos.
	 */
	static final String CAMPO_GRUPOS = "grupos";
	/**
	 * Campo acuerdos.
	 */
	static final String CAMPO_ACUERDOS = "acuerdos";
	/**
	 * Campo observaciones.
	 */
	static final String CAMPO_OBSERVACIONES = "observaciones";
	/**
	 * Reunión.
	 */
	Reunion reunion;
	/**
	 * Servicio de reuniones.
	 */
	@In(create = true)
	ReunionesService reunionesService;

	public void acta() throws IOException, DocumentTemplateException {
		Map<String, Object> mapModel = new HashMap<String, Object>();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		Date date = new Date();
		mapModel.put(FECHA_HORA, sdf.format(date));
		mapModel.put(TITULO_REGISTRO, Message.get("report.meeting.title"));
		mapModel.put(TITULO_ORDEN, Message.get("report.meeting.agenda"));
		mapModel.put(TITULO_ASISTENTES, Message.get("report.meeting.users"));
		mapModel.put(TITULO_GRUPOS, Message.get("report.meeting.bands"));
		mapModel.put(TITULO_ACUERDOS, Message.get("report.meeting.agreements"));
		mapModel.put(TITULO_OBSERVACIONES, Message.get("report.meeting.comments"));

		Object[] params = new String[3];
		sdf = new SimpleDateFormat("dd/MM/yyyy");
		params[0] = sdf.format(reunion.getFecha());
		sdf = new SimpleDateFormat("HH:mm");
		params[1] = sdf.format(reunion.getFecha());
		params[2] = reunion.getLugar();
		String texto = MessageFormat.format(Message.get("report.meeting.text"), params);

		mapModel.put(TEXTO_REUNION, texto);

		mapModel.put(CAMPO_ORDEN, reunion.getOrden());
		StringBuffer asistentes = new StringBuffer();
		for (Asistente asistente : reunion.getAsistentes()) {
			if (asistentes.length() != 0) {
				asistentes.append(", ");
			}
			Usuario usuario = asistente.getUsuario();
			asistentes.append(Utils.getNombreApellidos(usuario.getNombre(), usuario.getPrimerApellido(), usuario.getSegundoApellido()));
		}

		List<Grupo> gruposList = reunionesService.obtenerGruposRepresentados(reunion);
		StringBuffer grupos = new StringBuffer();
		for (Grupo grupo : gruposList) {
			if (grupos.length() != 0) {
				grupos.append(", ");
			}
			grupos.append("\"");
			grupos.append(grupo.getNombre());
			grupos.append("\"");
		}

		mapModel.put(CAMPO_ASISTENTES, asistentes.toString());
		mapModel.put(CAMPO_GRUPOS, grupos.toString());
		String acuerdos = "";
		if (reunion.getAcuerdos() != null) {
			acuerdos = reunion.getAcuerdos();
		}
		mapModel.put(CAMPO_ACUERDOS, acuerdos);
		String observaciones = "";
		if (reunion.getObservaciones() != null) {
			observaciones = reunion.getObservaciones();
		}
		mapModel.put(CAMPO_OBSERVACIONES, observaciones);

		write(mapModel, "ACTA", RUTA_PLANTILLA_LISTADO, date);
	}

	public Reunion getReunion() {
		return reunion;
	}

	public void setReunion(Reunion reunion) {
		this.reunion = reunion;
	}
}
